使用关键字decltype(在C++11中引入)，可以检查C++表达式的值类别。对于任意表达式x, decltype((x))(注意双括号)会产生:

\begin{itemize}
\item 
x是类型，则为prvalue

\item
x是左值引用，则为lvalue

\item
x是右值引用，则为xvalue
\end{itemize}

decltype((x))中需要双括号，以避免在表达式x确实命名了实体的情况下，产生命名实体的声明类型(其他情况下，括号不起作用)。若表达式x只是将一个变量命名为v，那么不带圆括号的构造就变成了decltype(v)，其生成变量v的类型，而不是反映引用该变量的表达式x的值类别的类型。

因此，对任意表达式e使用类型特征，可以使用如下方法检查其值的类别:

\begin{lstlisting}[style=styleCXX]
if constexpr (std::is_lvalue_reference<decltype((e))>::value) {
	std::cout << "expression is lvalue\n";
}
else if constexpr (std::is_rvalue_reference<decltype((e))>::value) {
	std::cout << "expression is xvalue\n";
}
else {
	std::cout << "expression is prvalue\n";
}
\end{lstlisting}

详见第15.10.2节。







